C++基础(命名空间,输入输出流,缺省参数,函数重载) 您所在的位置:网站首页 c++ 输出头文件 C++基础(命名空间,输入输出流,缺省参数,函数重载)

C++基础(命名空间,输入输出流,缺省参数,函数重载)

2022-11-09 06:02| 来源: 网络整理| 查看: 265

@[TOC]

前言

C++是在C语言的基础上提出的,本节将区分C与C++的一些相似且易错的知识点,进行过渡的同时,为接下来的C++学习奠定基础。

C++关键字

C++是在C语言基础之上产生的,所以C++的关键字包含了很多C语言的关键字,这也说明C++是兼容C语言的。 C++的关键字有63个: asm,do,if,return,try,continue,auto,double,inline,short,tepedef,for,bool,dynamic_cast,int,signed,typeid,for,public,break,else,long,sizeof,typename,throw,case,enum,mutable,static,union,wchar_t,catch,explicit,namespace,static_cast,unsigned,default,char,export,new,struct,using,friend,class,extern,operator,switch,virtual,register,const,false,private,template,void,true,const_cast,float,protected,this,volatile,while,delete,goto,reinterpret_cast

命名空间 作用

C++的引入是在C语言的基础上的,所以引入的东西也都是C语言所缺陷的,在C语言中没有命名空间这一说法,使得我们无法使用C语言提供的函数名作为参数名,举一个栗子:

#include #include int main() { int printf = 10; printf("%d", printf); }

这一段程序是不正确的程序,由于printf是已经在stdio.h中定义过的函数名,不能再使用它作为变量名了。 在一个公司中,一个工程往往都是好多人一起来完成的,这就可能出现,两个人定义了相同名称的变量,但是他们都不知道造成一定的麻烦,因此C++引入命名空间这一概念,来使得可以定义相同名称的变量而不会产生冲突

命名空间的使用

命名空间是定义在全局中的,因此其中的变量都是存在内存中的静态区 使用命名空间就要使用关键字:namespace,下面就是命名空间的书写。

namespace llb { int printf = 10; int Add(int left, int right) { return left + right; } struct Node { struct Node* next; int val; }; }

这样就定义了一个名叫llb的命名空间,它里面的内容可以是变量,函数也可以是结构体。 那么如何使用其中的变量呢,这就需要域作用限定符‘::’ 只需要将代码改为:

printf("%d", llb::printf);

llb:printf表示的就是引用的printf是llb中的printf而不是全局或者主函数中的printf。打印的结果是: 在这里插入图片描述 引用其中的函数也是同理: 在这里插入图片描述 在引用结构体时注意,命名空间要放在struct的后面:

struct llb::Node a; 命名空间的原理

命名空间的原理与编译器的查找规则有关。对于这样一段代码:

printf("%d", a);

编译器在打印a这个变量的时候,首先会在主函数中去寻找a这个变量的值,如果没有找到就会在全局中(静态区)寻找,再没找到就会报错。这也说明了在全局中与主函数中定义的相同名字的变量,在使用的时候会首先使用主函数中定义的。 而命名空间既不在主函数中也不再全局中,必须进过::操作符的引用才能打印。 当加入lib::时,编译器就只会从该命名空间来查找这一变量了。

命名空间的展开

命名空间的展开指的就是将命名空间中的变量展开到全局中。

部分展开

使用using 可以进行空间的部分展开,举一个例子:

namespace llb { int a = 20; int b = 30; } using llb::a; int main() { printf("%d", a); }

在全局中加入using llb::a,即可在函数中不引用a来使用a,即a已经进入到了全局中,但是不能使用b,因为b没有进入全局中。

全部展开

使用using namespace可以进行命名空间的全部展开,但是需要慎用,因为全部展开之后命名空间将不再有意义。

namespace llb { int a = 20; int b = 30; } using namespace llb; int main() { printf("%d", a); printf("%d", b); }

在这里插入图片描述 全部展开有一个重要的应用,就是展开std域。 在书写C++程序时,我们经常会发现在开头都有这样一段代码:

#include using namespace std; int main() { cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有